print("实例与类绑定方法##################################################start")


class Student(object):
    pass


def setName(self, name):
    self.name = name


from types import MethodType

s = Student()

s.setName = MethodType(setName, s)
s.setName("wx")
print(s.name)
# 但是，给一个实例绑定的方法，对另一个实例是不起作用的
s = Student()
# s.setName("wxxxx")
# print(s.name)

# class绑定方法
Student.setName = setName
s = Student()
s.setName("wxx")
print(s.name)


# _slots__变量，来限制该class实例能添加的属性
class Student2(object):
    __slots__ = ('name', 'age')  # 用tuple定义允许绑定的属性名称


s2 = Student2()
s2.name = "wx"
print(s2.name)
s2.age = 18
print(s2.age)
# s2.aa = "wxxx"
# __slots__定义的属性仅对当前类实例起作用，对继承的子类是不起作用的
# 除非在子类中也定义__slots__，这样，子类实例允许定义的属性就是自身的__slots__加上父类的__slots__。
print("实例与类绑定方法##################################################end\n")
